
//
//  MCRefreshControl.swift
//  HXWeibo
//
//  Created by HX on 15/12/13.
//  Copyright © 2015年 HX. All rights reserved.
//

import UIKit

/// 自定义刷新控件，继承系统的刷新控件
class MCRefreshControl: UIRefreshControl
{
    //MARK: - 属性
    ///箭头旋转的值
    private let refreshControlRotationValue: CGFloat = -60
    
    /// 标记，记录箭头的状态
    private var isUp = false
    
    // 覆盖刷新控件的frame  当拖动tableView时,frame会不断的改变
    override var frame: CGRect
        {
            didSet
            {
//                print("刷新控件的frame--->\(frame)")
                // 当frame.origin.y > 0 不用关心
                if frame.origin.y > 0
                {
                    // 刷新控件是被tableView挡住的，看不见
                    return
                }
                
                //判断刷新控件的刷新状态
                if refreshing
                {
                    // 刷新控件进入刷新状态,调用refreshView开始旋转
                    refreshView.startRotation()
                }
                
                // 当frame.origin.y > -60箭头向下,
                // 当frame.origin.y < -60箭头向上
                if frame.origin.y < refreshControlRotationValue && !isUp
                {
                    isUp = true
                    
                    // 动画，箭头转上去
                    refreshView.tipIconRotation(isUp)
                }
                else if frame.origin.y > refreshControlRotationValue && isUp
                {
                    isUp = false
                    
                    // 箭头转下来
                    refreshView.tipIconRotation(isUp)
                }
            }
        }
    
    required init?(coder aDecoder: NSCoder)
    {
        fatalError("init(coder:) has not been implemented")
    }
    
    override init()
    {
        super.init()
        
        prepareUI()
    }
    
    // 覆盖父类的方法
    override func endRefreshing()
    {
        super.endRefreshing()
        
        // 让子定义的view停止刷新
        refreshView.stopRotation()
        
    }
    
    //MARK: - 准备UI
    private func prepareUI()
    {
        // 添加控件
        addSubview(refreshView)
        
        // 从xib加载的view，在xib里面设置多大，它就多大
//        print("refreshView--->\(refreshView)");
        
        // 添加约束
        refreshView.ff_AlignInner(type: ff_AlignType.CenterCenter, referView: self, size: refreshView.bounds.size)
    }
    
    // 懒加载
    // 自定义刷新控件的view
    private lazy var refreshView = MCRefreshView.refreshView()
}

/// 自定义刷新控件内部的view
class MCRefreshView: UIView
{
    /// 箭头  !表示隐式拆包,在构造函数调用的时候，还没有值，但是在我们调用时一定有值，在使用的时候会自动强制拆包
    @IBOutlet weak var tipIcon: UIImageView!
    
    // 箭头和下拉刷新数据label的父控件
    @IBOutlet weak var tipView: UIView!
    
    // 转轮
    @IBOutlet weak var loadView: UIImageView!
    
    // 从xib加载view
    class func refreshView() -> MCRefreshView
    {
        return NSBundle.mainBundle().loadNibNamed("MCRefreshView", owner: nil, options: nil).last as! MCRefreshView
    }
    /// 箭头旋转 isUp: true 箭头转上去,false,箭头转下来
    func tipIconRotation(isUp: Bool)
    {
        UIView.animateWithDuration(0.25) { () -> Void in
            
            self.tipIcon.transform = isUp ? CGAffineTransformMakeRotation(CGFloat(M_PI - 0.01)) : CGAffineTransformIdentity
        }
    }
    /// 开始刷新
    func startRotation()
    {
        let animationKey = "rotation"
        
        // 判断动画是否正在进行，如果正在动画，就不添加动画了
        if let _ = loadView.layer.animationForKey(animationKey)
        {
            // 有动画
//            print("有动画，直接返回")
            return
        }
        
        // 隐藏tipView
        tipView.hidden = true
        
        // 旋转的核心动画
        let rotation = CABasicAnimation(keyPath: "transform.rotation")
        
        // 设置动画参数
        rotation.toValue = 2 * M_PI
        rotation.duration = 0.25
        rotation.repeatCount = MAXFLOAT
        
        // 添加到图层，开始动画
        loadView.layer.addAnimation(rotation, forKey: animationKey)
    }
    
    // 停止刷新
    func stopRotation()
    {
        // 显示箭头
        tipView.hidden = false
        
        //移除旋转动画
        loadView.layer.removeAllAnimations()
    }
}






























